package com.anolesoft.yr.mbus.sup.controller;

import com.anolesoft.common.core.web.domain.AjaxResult;
import com.anolesoft.yr.mbus.sup.dto.SupBaseDTO;
import com.anolesoft.yr.mbus.sup.service.SupBaseService;
import com.anolesoft.yr.mbus.sup.vo.SupBaseVO;
import com.anolesoft.yr.util.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author zhj
 * @date 2020/8/11 10:08
 */
@RestController
public class SupBaseController {
    @Autowired
    private SupBaseService supBaseService;

//    private SupBaseVO dto2vo(SupBaseDTO t) {
//        BaseRegionDTO region = t.getRegion();
//        BaseRegionVO baseRegionVO = null;
//        if (region != null) {
//            baseRegionVO = BaseRegionVO.builder()
//                    .remark(region.getRemark())
//                    .parentUid(StringUtils.isEmpty(region.getParentUid()) ? "-" : region.getParentUid())
//                    .modifyUserUid(region.getModifyUserUid())
//                    .deleteFlag(region.getDeleteFlag())
//                    .createUserUid(region.getCreateUserUid())
//                    .regionCode(region.getRegionCode())
//                    .regionLevel(region.getRegionLevel())
//                    .regionName(region.getRegionName())
//                    .factoryCode(region.getFactoryCode())
//                    .objuid(region.getObjuid())
//                    .build();
//        } else {
//            baseRegionVO = new BaseRegionVO();
//        }
//        List<BaseContactVO> contactVOS = t.getContacts().stream().map(baseContactDTO -> BaseContactVO.builder()
//                .contactNumber(baseContactDTO.getContactNumber())
//                .contactPerson(baseContactDTO.getContactPerson())
//                .createTime(baseContactDTO.getCreateTime())
//                .createUserUid(baseContactDTO.getCreateUserUid())
//                .crmAddress(baseContactDTO.getCrmAddress())
//                .deleteFlag(baseContactDTO.getDeleteFlag())
//                .factoryCode(baseContactDTO.getFactoryCode())
//                .modifyTime(baseContactDTO.getModifyTime())
//                .modifyUserUid(baseContactDTO.getModifyUserUid())
//                .objuid(baseContactDTO.getObjuid())
//                .postcode(baseContactDTO.getPostcode())
//                .remark(baseContactDTO.getRemark())
//                .targetUid(baseContactDTO.getTargetUid())
//                .type(baseContactDTO.getType())
//                .build()).collect(Collectors.toList());
//        return SupBaseVO.builder()
//                .account(t.getAccount())
//                .bank(t.getBank())
//                .baseRegionUid(t.getBaseRegionUid())
//                .supAddress(t.getSupAddress())
//                .supCode(t.getSupCode())
//                .supGrade(t.getSupGrade())
//                .supName(t.getSupName())
//                .supOtherName(t.getSupOtherName())
//                .companyType(t.getCompanyType())
//                .supWebsite(t.getSupWebsite())
//                .contactNumber(t.getContactNumber())
//                .contactPerson(t.getContactPerson())
//                .createTime(t.getCreateTime())
//                .createUserUid(t.getCreateUserUid())
//                .deleteFlag(t.getDeleteFlag())
//                .email(t.getEmail())
//                .establishTime(t.getEstablishTime())
//                .factoryCode(t.getFactoryCode())
//                .faxNumber(t.getFaxNumber())
//                .legalPerson(t.getLegalPerson())
//                .modifyTime(t.getModifyTime())
//                .modifyUserUid(t.getModifyUserUid())
//                .objuid(t.getObjuid())
//                .region(baseRegionVO)
//                .remark(t.getRemark())
//                .taxNumber(t.getTaxNumber())
//                .contacts(contactVOS)
//                .build();
//    }

    @PostMapping(value = "/api/sup/supbase/add", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult create(SupBaseVO supBaseVO) {
        SupBaseDTO supBaseDTO = vo2dto(supBaseVO, true);
        return new AjaxResult(HttpStatus.SUCCESS, Constants.CREATE_SUCCESS_MESSAGE, supBaseService.create(supBaseDTO));
    }

    private SupBaseDTO vo2dto(SupBaseVO supBaseVO,boolean newId) {
        return SupBaseDTO.builder()
                .supAddress(supBaseVO.getSupAddress())
                .supOtherName(supBaseVO.getSupOtherName())
                .supName(supBaseVO.getSupName())
                .supCode(supBaseVO.getSupCode())
                .baseRegionUid(supBaseVO.getBaseRegionUid())
                .factoryCode(supBaseVO.getFactoryCode())
                .modifyUserUid(SecurityUtils.getUserId())
                .taxNumber(supBaseVO.getTaxNumber())
                .remark(supBaseVO.getRemark())
                .objuid(newId ? CommonUtils.fastUUID() : supBaseVO.getObjuid())
                .legalPerson(supBaseVO.getLegalPerson())
                .faxNumber(supBaseVO.getFaxNumber())
                .establishTime(supBaseVO.getEstablishTime())
                .email(supBaseVO.getEmail())
                .createUserUid(SecurityUtils.getUserId())
                .contactPerson(supBaseVO.getContactPerson())
                .contactNumber(supBaseVO.getContactNumber())
                .supWebsite(supBaseVO.getSupWebsite())
                .companyType(supBaseVO.getCompanyType())
                .supGrade(supBaseVO.getSupGrade())
                .bank(supBaseVO.getBank())
                .account(supBaseVO.getAccount())
                .build();
    }

    @PutMapping(value = "/api/sup/supbase/update", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult modify(SupBaseVO supBaseVO) {
        SupBaseDTO supBaseDTO = vo2dto(supBaseVO, false);
        return new AjaxResult(HttpStatus.SUCCESS, Constants.MODIFY_SUCCESS_MESSAGE, supBaseService.modify(supBaseDTO));
    }

    @DeleteMapping(value = "/api/sup/supbase/delete/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult remove(@PathVariable("id") String id) {
        return new AjaxResult(HttpStatus.SUCCESS, Constants.DELETE_SUCCESS_MESSAGE, supBaseService.remove(id));
    }

    @DeleteMapping(value = "/api/sup/supbase/delete", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult remove(@RequestParam("ids[]") List<String> ids) {
        return new AjaxResult(HttpStatus.SUCCESS, Constants.DELETE_SUCCESS_MESSAGE, supBaseService.removeBatch(ids));
    }

    @GetMapping(value = "/api/sup/supbase/get/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult selectOneById(@PathVariable("id") String id) {
        Optional<SupBaseDTO> supBaseDTO = this.supBaseService.selectOneById(id);
        if (supBaseDTO.isPresent()) {
            return new AjaxResult(HttpStatus.SUCCESS, Constants.QUERY_SUCCESS_MESSAGE, CustomBeanUtils.supBaseDTO2VO(supBaseDTO.get()));
        } else {
            return new AjaxResult(HttpStatus.SUCCESS, Constants.QUERY_SUCCESS_MESSAGE, null);
        }

    }

    @GetMapping(value = "/api/sup/supbase/list/all", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult selectAll() {
        List<SupBaseVO> vos = supBaseService.selectAll().stream().map(t -> CustomBeanUtils.supBaseDTO2VO(t)).collect(Collectors.toList());
        PageInfo<List<SupBaseVO>> pageInfo = new PageInfo<>(vos.size(), vos);
        return new AjaxResult(HttpStatus.SUCCESS, Constants.QUERY_SUCCESS_MESSAGE, pageInfo);
    }

    @GetMapping(value = "/api/sup/supbase/list/all/page", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult selectPageAll(
            @RequestParam("rows") Integer limit,
            @RequestParam("page") Integer curr) {
//        List<SupBaseVO> vos = supBaseService.selectAll(limit, curr).stream().map(t -> dto2vo(t)).collect(Collectors.toList());
//        PageInfo<List<SupBaseVO>> pageInfo = new PageInfo<>(limit, vos.size(), vos);
        PageData<List<SupBaseDTO>> pageData = supBaseService.selectAll(limit, curr);
        List<SupBaseVO> vos = pageData.getItems().stream().map(t -> CustomBeanUtils.supBaseDTO2VO(t)).collect(Collectors.toList());
        PageInfo<List<SupBaseVO>> pageInfo = new PageInfo<>(limit, pageData.getTotal(), vos);
        return new AjaxResult(HttpStatus.SUCCESS, Constants.QUERY_SUCCESS_MESSAGE, pageInfo);
    }

    @GetMapping(value = "/api/sup/supbase/list/condition", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult selectList(SupBaseVO supBaseVO) {
        SupBaseDTO supBaseDTO = vo2dto(supBaseVO, false);
        List<SupBaseVO> vos = this.supBaseService.selectList(supBaseDTO).stream().map(t -> CustomBeanUtils.supBaseDTO2VO(t)).collect(Collectors.toList());
        PageInfo<List<SupBaseVO>> pageInfo = new PageInfo<>(vos.size(), vos);
        return new AjaxResult(HttpStatus.SUCCESS, Constants.QUERY_SUCCESS_MESSAGE, pageInfo);
    }

    @GetMapping(value = "/api/sup/supbase/list/condition/page", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult selectListPage(SupBaseVO supBaseVO) {
        SupBaseDTO supBaseDTO = vo2dto(supBaseVO, false);
        Integer limit = supBaseVO.getRows();
        Integer curr = supBaseVO.getPage();
//        List<SupBaseVO> vos = this.supBaseService.selectList(supBaseDTO, limit, curr).stream().map(t -> dto2vo(t)).collect(Collectors.toList());
//        PageInfo<List<SupBaseVO>> pageInfo = new PageInfo<>(limit, vos.size(), vos);
        PageData<List<SupBaseDTO>> pageData = supBaseService.selectList(supBaseDTO, limit, curr);
        List<SupBaseVO> vos = pageData.getItems().stream().map(t -> CustomBeanUtils.supBaseDTO2VO(t)).collect(Collectors.toList());
        PageInfo<List<SupBaseVO>> pageInfo = new PageInfo<>(limit, pageData.getTotal(), vos);
        return new AjaxResult(HttpStatus.SUCCESS, Constants.QUERY_SUCCESS_MESSAGE, pageInfo);
    }

    @PostMapping(value = "/api/sup/supbase/list/combox", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult selectCombox(@RequestBody SupBaseVO supBaseVO) {
        SupBaseDTO supBaseDTO = vo2dto(supBaseVO, false);
        Integer limit = supBaseVO.getRows();
        Integer curr = supBaseVO.getPage();
        PageData<List<SupBaseDTO>> pageData = supBaseService.selectCombox(supBaseDTO, limit, curr);
        List<SupBaseVO> vos = pageData.getItems().stream().map(CustomBeanUtils::supBaseDTO2VO).collect(Collectors.toList());
        PageInfo<List<SupBaseVO>> pageInfo = new PageInfo<>(limit, pageData.getTotal(), vos);
        return new AjaxResult(HttpStatus.SUCCESS, Constants.QUERY_SUCCESS_MESSAGE, pageInfo);
    }
}
